package gui;

import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.StringTokenizer;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import mpc.NumberNode;

public class PanelForSearchTree extends TreeDrawingPanel implements
		ActionListener, KeyListener, MouseListener {
	
	final static String добавить_элементы = "добавить элементы", найти_элемент = "найти элемент", помощь = "помощь",
			очистка = "очистка";
	
	public PanelForSearchTree(int mw, int mh, JFrame wFrame) {
		super(mw, mh, wFrame);
		if(WorkFrame == null)
			System.out.println("PFST: workFrame is null");
		
		//addKeyListener(this);
		addMouseListener(this);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getActionCommand() == добавить_элементы){
			/*
			String[] options = {"40 30 25 45 43",
					"8 2 10 9 8"};
			String s = (String) JOptionPane.showInputDialog(WorkFrame,
					"Введите число, которое нужно добавить.\n" +
					"Если надо добавить несколько чисел, введите их через пробел.", 
					"Вставка чисел...", JOptionPane.QUESTION_MESSAGE, null, options, "");
				*/
			String s = (String) ((JComboBox<String>) e.getSource()).getSelectedItem();
			//((JComboBox<String>) e.getSource()).
			
			if(sIsCorrect(s)){
				if(root == null){
					root = new NumberNode(s);
				} else {
					((NumberNode) root).addValue(s);
				}
				root.initSituation(this.getGraphics().getFontMetrics());
				initializationsAfterAttachingTree();
			} else {
				JOptionPane.showMessageDialog(WorkFrame, "Элементы не добавлены.", "Ошибка...", JOptionPane.ERROR_MESSAGE);
			}
		}
		
		if(e.getActionCommand() == найти_элемент){
			if(root != null){
				String s = (String) JOptionPane.showInputDialog(WorkFrame,
						"Введите число, которое хотите найти", 
						"Поиск...", JOptionPane.QUESTION_MESSAGE, null, null, "");
				
				boolean r = false;
				if(sIsCorrect(s)){
					r = ((NumberNode) root).find(Integer.parseInt((new StringTokenizer(s)).nextToken()));
				}
				
				initializationsAfterAttachingTree();
				if(r){
					return;
				} else {
					JOptionPane.showMessageDialog(WorkFrame, "Данного числа в дереве нет.", "Неудача...",
							JOptionPane.WARNING_MESSAGE);
				}
			} else {
				JOptionPane.showMessageDialog(WorkFrame, "Дерево пустое.", "Неудача...",
						JOptionPane.WARNING_MESSAGE);
			}
			
			
		}
		
		if(e.getActionCommand() == помощь){
			JOptionPane.showMessageDialog(WorkFrame, "-Для того, чтобы добавить последовательность\n" +
					"элементов, введите их в строку через пробел.\n" +
					"-Чтобы удалить элемент, щёлкните по нему правой\n" +
					"кнопкой мыши.\n" +
					"-Для поиска элемента либо нажмите соответствующую кнопку,\n" +
					"либо воспользуйтесь сочетанием клавиш Alt+F\n" +
					"-Для вызова этой справки можно использовать\n" +
					"комбинацию Alt+F1\n" +
					"-Для очистки дерева нажмите Alt+F8", "Справка", JOptionPane.INFORMATION_MESSAGE);
		}
		if(e.getActionCommand() == очистка){
			root = null;
			initializationsAfterAttachingTree();
		}
	}
	
	public static boolean sIsCorrect(String s){
		if(s == null)
			return false;
		boolean t = false;
		for(int i = 0; i < s.length(); i++){
			if(!(( '0' <= s.charAt(i) && s.charAt(i) <= '9') || s.charAt(i) == ' '))
				return false;
			
			if('0' <= s.charAt(i) && s.charAt(i) <= '9')
				t = true;
		}
		return t;
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		System.out.println("KeyPressed");
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		if(root != null)
			((NumberNode) root).resetColors();
		
		//((NumberNode) root).checkIfNullParent();
		
		if(e.getButton() == MouseEvent.BUTTON3){
			/*
			System.out.println("Panel, MouseClicked");
			System.out.println(e.getX() + " " + e.getY());
			*/
			Point p = e.getPoint();
			delete(p, (NumberNode) root);
		}
		
		initializationsAfterAttachingTree();
	}
	
	private void delete(Point p, NumberNode root){
		if(root == null)
			return;
		Rectangle bounds = getBounds(root);
		if(bounds.contains(p)){
			if(root == (NumberNode) this.root)
				this.root = root.deleteThis();
			else
				root.deleteThis();
				return;
		}
		
		delete(p, (NumberNode) root.leftSone());
		delete(p, (NumberNode) root.rightSone());
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

}
